package creational;

/**
 * 抽象工厂模式
 * 
 * 抽象工厂模式解决一系列相关或者相互依赖的子类产品实例化问题。
 * 在父类工厂中定义多个抽象方法，用于返回不同父类外观的产品。
 * 
 * @author 关关
 *
 */

public class AbstractFactory {
    public static void main(String[] args) {
    	F f =new FA();
    	System.out.println(f.getP1());//调用工厂A生产产品1
    	System.err.println(f.getP2());//调用工厂A生产产品2
    }
}

interface P1{}//产品1
interface P2{}//产品2
class PA1 implements P1 {}//生产产品1的A工厂
class PB1 implements P1 {}//生产产品1的B工厂
class PA2 implements P2 {}//生产产品2的A工厂
class PB2 implements P2 {}//生产产品2的B工厂

abstract class F{//抽象工厂
    public static F chooseF(String n){//选择工厂A或者B来生产产品
        switch (n){
            case "A": return new FA();
            case "B": return new FB();
            default: return null;
        }
    }
    public abstract P1 getP1();//获取产品1
    public abstract P2 getP2();//获取产品2
}
class FA extends F {
    public P1 getP1(){//获取A工厂生产的产品1方法
    	return new PA1();
    }
    public P2 getP2(){//获取A工厂上产的产品2方法
    	return new PA2();
    }
}
class FB extends F {
    public P1 getP1(){//获取B工厂生产的产品1方法
    	return new PB1();
    }
    public P2 getP2(){//获取B工厂生产的产品2方法
    	return new PB2();
    }
}

